문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 프로그래밍 언어 (문단 편집) === 해석 방식에 따른 분류 === 크게 AOT 컴파일 언어, JIT 컴파일 언어, 그리고 인터프리터 언어로 분류할 수 있다. 이 분류는 정확히 말하면 언어의 분류가 아니라 언어 구현체의 분류로, 언어 명세가 어느 한 쪽을 완전히 배제한 형태가 아니거나 다른 특별한 이유가 있지 않는 이상 대부분의 언어는 이론상 어떤 식으로든 구현 가능하다. 더불어, 산업 현장에서 널리 쓰이는 언어는 기본적으로 컴파일되어 실행된다고 보면 된다. 아래의 구분은 언어의 대표 구현체를 따른 것이고, 결코 언어 자체의 분류가 아님에 유의할 것. 예를 들면, C언어라고 항상 AOT 컴파일되는 것이 아니며[* Sulong을 통해 JVM 바이트코드로 컴파일되어 JVM에서 실행되던지, Emscripten 등으로 WASM으로 컴파일되어 자바스크립트 VM에서 실행된다], Java라고 항상 JIT 컴파일 되는 것도 아니며[* 안드로이드의 ART, 또는 SubstrateVM을 통해 AOT 컴파일된다], OCaml[* ocamlc와 ocamlopt]과 Erlang[* Erlang과 Erlang HiPE]등의 언어는 아예 기본 구현체에 둘 다 포함시켜서 배포한다. * AOT(Ahead Of Time) 컴파일 언어 : [[C(프로그래밍 언어)|C언어]], [[C++]], [[Rust(프로그래밍 언어)|Rust]], [[파스칼(프로그래밍 언어)|파스칼]], [[Haskell]] 등이 포함된다. 소스 코드를 [[컴파일|미리 기계어로 번역]][* 이 때문에 Native Language라고 불리기도 한다.]해서 실행한다. 미리 컴파일하더라도 [[가비지 컬렉션]]의 유무에 따라 실행속도가 차이가 나기도 한다. 일반적으로 C계열의 언어들의 런타임 퍼포먼스가 좋기 때문에 AOT 컴파일된 언어들이 근본적으로 다른 구현방식에 비해 빠르다는 착각을 하는 경우가 많으나, AOT 컴파일되었다고 런타임 퍼포먼스가 좋을 것이라고 지레짐작 해서는 안된다.[* 일례로, 사람들이 Java언어를 AOT컴파일하면 빨라질 것이라고 착각해, GraalVM으로 AOT컴파일한 후에 최초 실행시를 제외하고 전반적으로 더 느려짐에 당황하는 경우가 많다. AOT 컴파일러는 런타임에 JIT컴파일을 하지 않아도 되기 때문에 실행 직후에 이점이 있을 뿐, 본질적으로 JIT컴파일러보다 더 적은 정보만으로 최적화를 해야 해서 JIT컴파일이 끝난 다음의 결과물을 비교하면 오히려 일반적으로 성능상 떨어진다. [[https://foojay.io/today/java-performance-ahead-of-time-versus-just-in-time/|#]] C를 비롯한 대중적인 언어 이외에 깊이 접해보지 못한 사람들이 흔히 하는 착각이라 예시를 들어 서술한다.] * JIT 컴파일 언어 : 대부분의 언어가 여기에 속한다. [[Java]] 및 JVM 언어[* 대표적인 VM 구현체: HotSpot, OpenJ9], [[JavaScript]] 및 WebAssembly[* 대표적인 VM 구현체: V8, SpiderMonkey], [[C\#]] 및 CLR 언어[* 대표적인 VM 구현체: .NET, Mono] 등의 언어들은 기본 구현체가 JIT 컴파일러이다. 이 언어들은 대부분 바이트코드를 생성하는 1차 컴파일러, 그리고 1차 컴파일러가 생성한 바이트코드를 실행하는 가상머신(VM)으로 이루어져 있다. 이 가상머신 안에 바이트코드에 대한 인터프리터, 바이트코드를 기계어로 컴파일하는 JIT 컴파일러와 [[쓰레기 수집|GC]]를 비롯한 런타임이 포함된다. JVM과 CLR, CPython의 경우에는 1차 컴파일러가 생성한 바이트코드 파일들을 배포에 활용하지만, 모든 언어가 그런 것은 아니다. 또한, JIT 구현체는 동일한 언어의 AOT 구현체에 비해 유연성이 높은 경우가 많다. 예를 들면 [[Java]]에서는 JIT 컴파일할 시에는 가능한 동적인 클래스로딩이 SubstrateVM을 통한 AOT 컴파일 시에는 불가능하고, Reflection[* 실행 시간에 프로그램 자체에 대한 정보를 얻거나 수정하는 것을 뜻함]에 어느정도 제약이 가해진다. * 인터프리터 언어 : 소스 코드를 한 줄 한 줄 읽어 그때그때마다 번역해서 수행한다. [[BASIC]]이나 [[셸(컴퓨터)|bash]] 같은 언어가 이런 형태이다. 소스 코드를 한 줄씩 읽어서 수행하기 때문에 대체로 AOT 컴파일 언어나 JIT 컴파일 언어에 비해 성능이 떨어지는데 2010년대 들어서 인터프리터엔진에도 JIT기법이 도입되었다. [[Python]][* 대표적인 VM 구현체: CPython, Jython, PyPy 등], [[Ruby]][* 대표적인 VM 구현체: MRI, JRuby], [[PHP]][* 대표적인 VM 구현체: Zend VM, HHVM] 등이 있다. 장점은 구현이 단순하고 구현체의 절대적인 크기가 작다는 것이다. 그 밖에 bash, awk과 같이 구현체가 매우 가볍고 간단할 필요성이 있는 경우, 또는 구현체를 충분히 빠르게 만들도록 노력을 들이지 못한 수많은 마이너 언어들이 인터프리터를 통해 작동한다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기